package com.jwater.core.manager.proxy.cmd;

import com.jwater.core.manager.common.model.FileInfo;
import com.jwater.core.manager.common.model.JvmInfo;

import java.io.File;
import java.io.InputStream;
import java.util.List;

/**
 * @description:远程操作命令
 * @author: jnner
 * @createDate: 2021/2/5
 * @version: 1.0
 */
public interface CmdClient {
    /**
     * 启动管理进程
     *
     * @param id
     */
    public void startMaster(int id);

    /**
     * 停止管理进程
     *
     * @param id
     */
    public void stopMaster(int id);

    /**
     * 启动代理进程
     */
    public void startProxy();

    /**
     * 停止代理进程
     */
    public void stopProxy();

    /**
     * 启动工作进程
     *
     * @param host
     * @param regionName
     * @param deployName
     * @param groupName
     * @param workerName
     * @param index
     * @param jvmArgs
     */
    public void startWorker(String host, String regionName, String deployName, String groupName, String workerName,
                            int index, String jvmArgs);

    /**
     * 停止工作进程
     *
     * @param regionName
     * @param deployName
     * @param groupName
     * @param workerName
     * @param index
     */
    public void stopWorker(String regionName, String deployName, String groupName, String workerName, int index,
                           boolean isForce);

    /**
     * 执行通用命令
     *
     * @param cmd
     * @return
     */
    public List<String> cmd(String cmd);

    /**
     * 罗列远程目录下的文件
     *
     * @param dstDir
     * @param recursive
     * @return
     */
    public List<String> listFiles(String dstDir, boolean recursive);

    /**
     * 上传文件
     *
     * @param src
     * @param dst
     */
    public void putFile(InputStream src, String dst);

    /**
     * 下载文件
     *
     * @param dst
     * @return
     */
    public File getFile(String dst);

    /**
     * 移除文件
     *
     * @param dst
     */
    public void removeFile(String dst);

    /**
     * 获取文件内容
     *
     * @param dst
     * @param lineLimit
     * @param lineLenLimit
     * @return
     */
    public String getContent(String dst, int lineLimit, int lineLenLimit);

    /**
     * 保存文件内容
     *
     * @param dst
     * @param content
     */
    public void saveContent(String dst, String content);

    /**
     * 部署安装包
     *
     * @param fileName
     * @param dst
     * @param regionName
     * @param deployName
     * @param keepConf
     * @param version
     * @param path
     */
    public void deploy(String fileName, String dst, String regionName, String deployName, String keepConf, long version,
                       String path);

    /**
     * 移除安装包
     *
     * @param regionName
     * @param deployName
     */
    public void removeDeploy(String regionName, String deployName);

    /**
     * 运行离线任务
     *
     * @param regionName
     * @param deployName
     * @param groupName
     * @param jobName
     * @param time
     * @param once
     */
    public void runJob(String regionName, String deployName, String groupName, String jobName, long time, boolean once);

    /**
     * 杀死离线任务
     *
     * @param regionName
     * @param deployName
     * @param groupName
     * @param jobName
     */
    public void killJob(String regionName, String deployName, String groupName, String jobName);

    /**
     * 罗列日志文件
     *
     * @param regionName
     * @param dir
     * @return
     */
    public List<String> listLogFiles(String regionName, String dir);

    /**
     * 罗列java进程信息
     *
     * @return
     */
    public List<JvmInfo> listJvmInfo();

    /**
     * 执行jvm命令，获取对应的文件
     *
     * @param cmdType
     * @param pid
     * @return
     */
    public File cmdJvmFile(String cmdType, int pid);

    /**
     * 获取该目录下的文件信息
     *
     * @param dstDir
     * @return
     */
    public List<FileInfo> listFileInfos(String dstDir);

    /**
     * 改变部署属性
     *
     * @param regionName
     * @param deployName
     * @param key
     * @param value
     */
    public void changeDeployProp(String regionName, String deployName, String key, String value);
}
